package jjwt.study.Example;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.Base64Codec;

import java.util.Date;

/**
 * 描述:自定义申明token
 * @author Ychiha
 * @version 1.0
 * @date 14/1/2022 下午11:53
 */
public class JJWT_Clamis {

    /**
     * 创建Token(失效时间)
     * @return 返回生成的token
     */
    public static String CreateTokenExp(){

        //当前系统时间
        long now = System.currentTimeMillis();
        //过期时间 1分钟
        long exp = now + 60 * 1000;

        //创建JwtBuilder对象
        JwtBuilder jwtBuilder = Jwts.builder()
                //声明标识{"jti":"8888"}
                .setId("8888")
                //主体，用户("sub":"Rose")
                .setSubject("Rose")
                //创建日期 时间戳大大添加了安全性(尽管破解了签名，没有时间也无法伪造)
                .setIssuedAt(new Date())
                //设置算法和"盐"(盐决定加密后最终结果)
                .signWith(SignatureAlgorithm.HS256,"xxxx")
                //自定义申明
                .claim("key","value");
                    //直接传入Map
//                  .addClaims()



        //获取jwt的token
        String token = jwtBuilder.compact();
        System.out.println(token);

        System.out.println("==============");
        String[] split = token.split("\\.");
        //头部信息 算法
        System.out.println(Base64Codec.BASE64.decodeToString(split[0]));
        //负载 id、用户、签发日期
        System.out.println(Base64Codec.BASE64.decodeToString(split[1]));
        //签名:  无法解密
        System.out.println(Base64Codec.BASE64.decodeToString(split[2]));

        return token;
    }

    /**
     * 解析Token(失效时间)
     * @param token
     */
    public static void ParseTokenExp(String token){
        //过期的token - 报错
//        token = "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODg4Iiwic3ViIjoiUm9zZSIsImlhdCI6MTY0MjE3NTM2NCwiZXhwIjoxNjQyMTc1NDI0fQ.uoV6RCvCatyWcO3VaFGPT6CD9FO4z5ML4HPgRWGUef8";

        //解析token获取负载中声明的对象
        Claims claims = Jwts.parser()
                .setSigningKey("xxxx")
                .parseClaimsJws(token)
                .getBody();
        System.out.println("parse=======>");
        System.out.println("获取自定义申明的值:"+claims.get("key"));
    }
}
